/* global jQuery */
(function ($) {
    "use strict";
    $(function () {
        var search = function (str) {
                var tmp = str && str.length ? $.vakata.search(str, true, {
                        threshold: 0.2,
                        fuzzy: true,
                        caseSensitive: false
                    }) : null,
                    res = $('#api_inner')
                        .find('.item').hide()
                        .filter(function () {
                            return tmp ? tmp.search($(this).find('>h4>code').text()).isMatch : true;
                        }).show().length;
                $('#api_inner').find('#no_res')[!tmp || res ? 'hide' : 'show']();
                $('#api_inner').find('#cl_src')[tmp && res ? 'show' : 'hide']();
                if (!$('#srch').is(':focus')) {
                    $('#srch').val(str);
                }
                $(window).resize();
            },
            filter = function (str) {
                $('.item-inner').hide();
                if (str) {
                    var i = $('.item[rel="' + str + '"]');
                    if (!i.length) {
                        i = $('.item[rel^="' + str + '"]');
                    }
                    if (i && i.length) {
                        i = i.eq(0);
                        i.children('.item-inner').show().end();
                        if (i.offset().top < $(document).scrollTop() || i.offset().top + i.height() > $(document).scrollTop() + $(window).height()) {
                            i[0].scrollIntoView();
                        }
                    }
                }
            };

        var to1 = false;
        $(window).resize(function () {
            if (to1) {
                clearTimeout(to1);
            }
            to1 = setTimeout(function () {
                $('.page').css('minHeight', '0px').css('minHeight', ($(document).height() - $('#head').outerHeight()) + 'px');
            }, 50);
        });

        $('.tab-content').children().hide().eq(0).show();
        $('.nav a').on('click', function () {
            $(this).blur();
        });

        $.address
        //.state(window.location.protocol + '//' + window.location.host + window.location.pathname.replace(/^(.*?\/docs\/).*$/ig, '$1'))
            .init(function (e) {
                $('a:not([href^=http])').not($('.demo a')).address().on('click', function () {
                    if ($.address.pathNames().length < 2 && !$.address.parameter('f')) {
                        $(document).scrollTop(0);
                    }
                });
            })
            .change(function (e) {
                var page, elem, cont, srch;
                if (!e.pathNames.length || !$('#content').children('#' + e.pathNames[0]).length) {
                    $('#menu a').eq(0).click();
                    return;
                }
                page = e.pathNames[0];

                $('#menu').find('a[href$="' + page + '"]').blur().parent().addClass('active').siblings().removeClass('active');
                cont = $('#content').children('#' + page).show().siblings().hide().end();
                if (page === 'api') {
                    search($.address.parameter('q') ? decodeURIComponent($.address.parameter('q')) : '');
                    filter($.address.parameter('f') ? decodeURIComponent($.address.parameter('f')) : '');
                } else {
                    $('#srch').val('');
                    cont.find('.item').show();
                    elem = e.pathNames[1] ? cont.find('#' + e.pathNames[1]) : [];
                    if (elem.length) {
                        if (elem.hasClass('tab-content-item')) {
                            elem.siblings().hide().end().show().parent().prev().children().removeClass('active').eq(elem.index()).addClass('active');
                        } else {
                            elem[0].scrollIntoView();
                        }
                    }
                    //else {
                    //	document.documentElement.scrollTop = 0;
                    //}
                }
                $(window).resize();
            });

        var to2 = false;
        $('#srch').on('keyup', function () {
            if (to2) {
                clearTimeout(to2);
            }
            to2 = setTimeout(function () {
                var f = $.address.parameter('f'),
                    q = $('#srch').val(),
                    d = [];
                if (q && q.length) {
                    d.push('q=' + q);
                }
                if (f && f.length && false) {
                    d.push('f=' + f);
                }
                $.address.value('/api/' + (d.length ? '?' + d.join('&') : ''));
            }, 250);
        });

        var container = $('#api_inner'), str;
        $.getJSON('./jstree.json', function (data) {
            //return;
            $.each(data, function (ii, v) {
                if (v.description.full.indexOf('<p>lobals') === 0) {
                    return true;
                }
                if (v.ignore) {
                    return true;
                }
                var str = '', name, plugin, internal, params = [], retrn, priv = false, evnt = false, trig, i, j;
                for (i = 0, j = v.tags.length; i < j; i++) {
                    switch (v.tags[i].type) {
                        case "name":
                            name = v.tags[i].string;
                            break;
                        case "private":
                            priv = true;
                            break;
                        case "event":
                            evnt = true;
                            break;
                        case "trigger":
                            trig = v.tags[i].string;
                            break;
                        case 'plugin':
                            plugin = v.tags[i].string;
                            break;
                        case 'return':
                            retrn = '<ul class="params list-unstyled"><li><code class="param return">Returns</code><p><code class="type">' + v.tags[i].types.join('</code> <code class="type">') + '</code> ' + v.tags[i].description + '</p></li></ul>';

                            break;
                        case 'param':
                            params.push('<code class="param">' + v.tags[i].name + '</code><p><code class="type">' + v.tags[i].types.join('</code> <code class="type">') + '</code> ' + v.tags[i].description + '</p>');
                            break;
                    }
                }
                str += '<div class="item ' + (priv ? 'private' : '') + '" rel="' + (name ? name.replace('"', '') : '') + '">';
                if (name) {
                    if (name.indexOf('(') !== -1 && name.indexOf('$(') === -1) {
                        name = name.split('(');
                        name = '<strong>' + name[0] + '</strong> (' + name[1];
                    }
                    str += '<h4><code class="' + (name.indexOf('(') === -1 ? (evnt ? 'evnt' : 'prop') : 'func') + '">' + name + (evnt ? ' Event <i class="glyphicon glyphicon-flash"></i>' : '') + '</code>';
                    if (plugin) {
                        str += '<code class="meta plugin"><i class="glyphicon glyphicon-leaf"></i> ' + plugin + ' plugin</code> ';
                    }
                    if (priv) {
                        str += '<code class="meta">private</code> ';
                    }
                    str += '</h4>';
                }
                str += '<div class="' + (name ? "item-inner" : "") + '">';
                str += '<div>' + v.description.full + '</div>';
                if (params.length) {
                    str += '<ul class="params list-unstyled">';
                    for (var k = 0, l = params.length; k < l; k++) {
                        str += '<li>' + params[k] + '</li>';
                    }
                    str += '</ul>';
                }
                if (retrn) {
                    str += retrn;
                }
                if (trig) {
                    str += '<ul class="params list-unstyled"><li><code class="param trigger">Triggers</code><p><code class="evnt">' + trig.split(',').join('</code> <code class="evnt">') + '</code></p></li></ul>';
                }
                str += '</div>';
                str += '</div>';
                container.append(str);
            });

            $('#api h3').prepend('<i class="glyphicon glyphicon-leaf"></i>&nbsp;').closest('.item').css({
                'background': 'white',
                'border': '0',
                'borderRadius': '0', /*'borderBottom' : '1px solid #8b0000', 'textAlign' : 'center',*/
                'marginTop': '0',
                'paddingTop': '0'
            }).prev().css('marginBottom', '3em');

            $('.item > h4').on('click', function () {
                var r = $(this).parent().attr('rel');
                if (r && r.length) {
                    var q = $.address.parameter('q');
                    if ($.address.parameter('f') === r) {
                        $.address.value($.address.pathNames()[0] + '/' + (q ? '?q=' + q : ''));
                    } else {
                        $.address.value($.address.pathNames()[0] + '/?' + (q ? 'q=' + q + '&' : '') + 'f=' + r);
                    }
                }
                //$(this).next().slideToggle();
            });
            //$('.item > h4 > code').on('click', function () { $('#srch').val($(this).text().replace(' Event','')).keyup(); });

            container.find('pre').each(function () {
                var d = $('<div>'),
                    p = $(this).closest('.item').find('.item-inner');
                $(this).prev().appendTo(d);
                $(this).appendTo(d);
                p.append(d);
            });

            if ($('#srch').val().length) {
                search(decodeURIComponent($.address.parameter('q')));
            }
            filter(decodeURIComponent($.address.parameter('f')));
        });
    });
}(jQuery));